package com.njupt.swg.threadstudyjimin.item05.singleton;

import com.njupt.swg.threadstudyjimin.annotation.ThreadSafe;

/**
 * 懒汉模式，线程安全
 */
@ThreadSafe
public class SingletonExample3 {
    private SingletonExample3(){}

    private static volatile SingletonExample3 instance = null;

    public static SingletonExample3 getInstance(){
        if(instance == null){
            synchronized (SingletonExample2.class){
                if(instance == null){
                    instance = new SingletonExample3();
                    //1. memory = allocate() 分配对象的内存空间
                    //2. initMemory() 初始化对象
                    //3. instance = memory 设置instance指向刚分配的内存

                    //不加volatile，为什么线程不安全呢？
                    //JVM和cpu优化，会发生指令重排，上述的123可能会变成132
                    //假设有两个线程A，B进来，线程A执行到第一个if(instance == null)判断之前
                    //而线程B进入synchronized，执行了13，此时，instance=memory执行完有值了
                    //那么此时执行A，判断到instance不为null，那么直接返回instance了，但是还没有进行初始化
                }
            }
        }
        return instance;
    }
}
